Skip to content

Fix issue 14859: CheckBox and RadioButton ignore explicit BackColor values in VisualStylesMode.Net11 - #14865

Open
SimonZhao888 wants to merge 3 commits into
dotnet:mainfrom
SimonZhao888:Fix_Issue_14859
Open

Fix issue 14859: CheckBox and RadioButton ignore explicit BackColor values in VisualStylesMode.Net11#14865
SimonZhao888 wants to merge 3 commits into
dotnet:mainfrom
SimonZhao888:Fix_Issue_14859

Conversation

@SimonZhao888

@SimonZhao888 SimonZhao888 commented Aug 7, 2026

Copy link
Copy Markdown
Member

Fixes #14859

Root Cause

The NET11 Visual Styles rendering path overrides the BackColor explicitly set by the user, causing CheckBox and RadioButton controls to deviate from the standard WinForms property precedence rules.

Proposed changes

  • Retain the default appearance of .NET 11 visual styles, but if the developer explicitly sets the BackColor, render using the developer-specified value.
  • Add test cases for CheckBox and RadioButton.

Customer Impact

Restore existing WinForms behavior, namely, when the user sets the BackColor for CheckBox and RadioButton, the controls will be drawn with reference to the set value.

Regression?

  • No

Risk

  • Mini

Screenshots

Before

image

After

DarkMode:

14865-DarkMode.mp4

Light:

14865-Light.mp4

Test methodology

  • Manually
  • Automated test cases

Test environment(s)

  • 11.0.0-preview.7.26381.103

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This pull request fixes a rendering regression in the .NET 11 modern rendering path (VisualStylesMode.Net11) where CheckBox and RadioButton ignored explicitly set BackColor values by always painting the parent background.

Changes:

  • Updated CheckBoxModernAdapter and RadioButtonModernAdapter to fill the control background with BackColor when UseVisualStyleBackColor == false and BackColor is fully opaque.
  • Kept ParentBackgroundRenderer.Paint(...) for visual-style-backed and transparent/alpha backgrounds to preserve parent blending behavior.
  • Added regression tests for both controls to validate explicit BackColor behavior in VisualStylesMode.Net11, and adjusted existing accent tests to avoid being affected by the new background fill.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated no comments.

File Description
src/System.Windows.Forms/System/Windows/Forms/Controls/Buttons/ButtonInternal/CheckBoxModernAdapter.cs Conditionally fills with explicit BackColor when visual style background is disabled and color is opaque.
src/System.Windows.Forms/System/Windows/Forms/Controls/Buttons/ButtonInternal/RadioButtonModernAdapter.cs Same conditional background fill logic for RadioButton in modern Net11 mode.
src/test/unit/System.Windows.Forms/System/Windows/Forms/CheckBoxTests.cs Adds regression test for explicit BackColor in Net11; updates accent test to set UseVisualStyleBackColor = true.
src/test/unit/System.Windows.Forms/System/Windows/Forms/RadioButtonTests.cs Adds regression test for explicit BackColor in Net11; updates accent test to set UseVisualStyleBackColor = true.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@SimonZhao888
SimonZhao888 marked this pull request as draft August 7, 2026 06:59
@dotnet-policy-service dotnet-policy-service Bot added the draft draft PR label Aug 8, 2026
@SimonZhao888
SimonZhao888 marked this pull request as ready for review August 10, 2026 06:53
@SimonZhao888
SimonZhao888 requested a lite review from Copilot August 10, 2026 06:53

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 4 out of 4 changed files in this pull request and generated no new comments.

Suppressed comments (2)

src/test/unit/System.Windows.Forms/System/Windows/Forms/RadioButtonTests.cs:224

  • This test sets BackColor = Color.Red and then counts pixels matching Application.SystemVisualSettings.AccentColor across the whole bitmap. If the system accent color is red (or close enough for the 24-channel tolerance), the solid background will be counted as an accent pixel, making the unchecked case flaky. Consider using a BackColor derived from (and guaranteed to differ from) the accent color, and use that value for the background assertion.
        using RadioButton control = new()
        {
            BackColor = Color.Red,
            UseVisualStyleBackColor = true,
            Checked = isChecked,

src/test/unit/System.Windows.Forms/System/Windows/Forms/CheckBoxTests.cs:586

  • The test uses BackColor = Color.Red and then searches the whole bitmap for Application.SystemVisualSettings.AccentColor. If the Windows accent color happens to match red, the background fill will be counted as an accent pixel and can make the expectedAccent assertion flaky (especially for the unchecked case). Use a BackColor derived from (and guaranteed to differ from) the accent color, and reuse that value in the background assertion.
        using CheckBox box = new()
        {
            BackColor = Color.Red,
            UseVisualStyleBackColor = true,
            CheckState = checkState,

@dotnet-policy-service dotnet-policy-service Bot removed the draft draft PR label Aug 10, 2026
@KlausLoeffelmann

Copy link
Copy Markdown
Member

This looks good.
Couple of questions, though:

  • In the last screen video, at around 18 seconds, the background color of the switch itself changes from red to blau-ish. Is that because you changed the accent color?
  • Could you set for one checkbox and one RadioButton the Margin to 15 and also the Padding to 15, and then set individual backcolors? I just want to see, what controls the size of the background effectively. Thanks!

(Other than that, I would approve. I just want to see, if we would need to change something else based on the Padding/Margin outcome.)

@SimonZhao888

Copy link
Copy Markdown
Member Author
  • In the last screen video, at around 18 seconds, the background color of the switch itself changes from red to blau-ish. Is that because you changed the accent color?

Yes. I intentionally changed the AccentColor at that point to test the functionality. The switch background updates from red to a bluish color because it's picking up the new accent color as expected.

  • Could you set for one checkbox and one RadioButton the Margin to 15 and also the Padding to 15, and then set individual backcolors? I just want to see, what controls the size of the background effectively. Thanks!

Sure. I set both a CheckBox and a RadioButton with Margin = 15 and Padding = 15, and assigned individual BackColor values. The attached screenshot shows the result.

From what I can see, neither Margin nor Padding affects the size of the painted background area. The background is still rendered within the control's bounds. Margin only affects the spacing around the control during layout, while Padding affects the content layout inside the control.

Based on this test, the effective background size appears to be determined primarily by the control's own size rather than its Margin or Padding settings.

Please let me know if there are any other scenarios you'd like me to try.

image

Control.ClientRectangle,
Control.BackColor);
bool useControlBackColor = !Control.BackColor.HasTransparency()
&& (Control.ShouldSerializeBackColor() || !Control.UseVisualStyleBackColor);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Explicit translucent BackColor values are still ignored here. ButtonBase supports transparent back colors, but when HasTransparency() is true this falls through to ParentBackgroundRenderer.Paint. With a parent, that helper paints only the parent background; Control.BackColor is merely a no-parent fallback and is never composited over it. For example, a 50%-alpha Aqua BackColor on a white parent still renders white. Please paint the parent first and then overlay the translucent control color. The same issue exists in RadioButtonModernAdapter.

Color backgroundPixel = bitmap.GetPixel(box.Width - 2, box.Height / 2);
Assert.Equal(Color.Red.ToArgb(), backgroundPixel.ToArgb());
Assert.Equal(
expectedAccent,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This assertion is environment-dependent because the entire control background is Color.Red. If the Windows Accent color is red, the unchecked case finds the background pixels and reports an accent glyph that was never drawn. Please choose a background color guaranteed to differ from Application.SystemVisualSettings.AccentColor (and make the equivalent change in RadioButtonTests).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

CheckBox and RadioButton ignore explicit BackColor values in VisualStylesMode.Net11

4 participants